package monopoli.game;

import java.util.ArrayList;
import java.util.Iterator;
import monopoli.Monopoli;

public class Tabellone {

    private ArrayList<Casella> caselle;

    public Tabellone () {
    }

    public ArrayList<Casella> getCaselle () {
        return caselle;
    }

    public void setCaselle (ArrayList<Casella> val) {
        this.caselle = val;
    }
    
    public Casella getCasella(int i) {
        return (Casella)caselle.get(i);
    }
    
    public Casella getCasella(String s) {
        Iterator it = caselle.iterator();
        while(it.hasNext()) {
            Casella c = (Casella)it.next();
            
            if(s.compareTo(c.getNome()) == 0) {
                return c;
            }
        }
        return null;
    }

   
    public void inizializzaTabellone() {
        
        Monopoli.getMonopoliGUI().debugMessage("[DBG_game] Inizializzazione del Tabellone");
        
        ArrayList<Casella> caselleList = new ArrayList<Casella>();
        //Creo le caselle e imposto i valori relativi
        
        //VIA
        Casella c1 = new Via();
        c1.setId(1);
        c1.setNome("via");
        c1.setNomeEsteso("Via");
        caselleList.add(c1);
        
        
        //VICOLO CORTO
        Casella c2 = new Terreno();
        c2.setId(2);
        c2.setNome("corto");
        c2.setNomeEsteso("Vicolo Corto");
        caselleList.add(c2);
        
        //PROBABILITA'
        Casella c3 = new Probabilita();
        c3.setId(3);
        c3.setNome("probabilita1");
        c3.setNomeEsteso("Probabilità");
        caselleList.add(c3);
        
        //VICOLO STRETTO
        Casella c4 = new Terreno();
        c4.setId(4);
        c4.setNome("stretto");
        c4.setNomeEsteso("Vicolo Stretto");
        caselleList.add(c4);
        
        //TASSA PATRIMONIALE
        Casella c5 = new Tassa();
        c5.setId(5);
        c5.setNome("patrimoniale");
        c5.setNomeEsteso("Tassa Patrimoniale");
        caselleList.add(c5);
        
        //STAZIONE SUD
        Casella c6 = new Stazione();
        c6.setId(6);
        c6.setNome("sud");
        c6.setNomeEsteso("Stazione Sud");
        caselleList.add(c6);
        
        //BASTIONI GRAN SASSO
        Casella c7 = new Terreno();
        c7.setId(7);
        c7.setNome("sasso");
        c7.setNomeEsteso("Bastioni Gran Sasso");
        caselleList.add(c7);
        
        //IMPREVISTI
        Casella c8 = new Imprevisto();
        c8.setId(8);
        c8.setNome("imprevisto1");
        c8.setNomeEsteso("Imprevisto");
        caselleList.add(c8);
        
        //VIALE MONTEROSA
        Casella c9 = new Terreno();
        c9.setId(9);
        c9.setNome("monterosa");
        c9.setNomeEsteso("Viale Monterosa");
        caselleList.add(c9);
        
        //VIALE VESUVIO
        Casella c10 = new Terreno();
        c10.setId(10);
        c10.setNome("vesuvio");
        c10.setNomeEsteso("Viale Vesuvio");
        caselleList.add(c10);
        
        //TRANSITO
        Casella c11 = new Libera();
        c11.setId(11);
        c11.setNome("transito");
        c11.setNomeEsteso("Transito - Prigione");
        caselleList.add(c11);
        
        //VIA ACCADEMIA
        Casella c12 = new Terreno();
        c12.setId(12);
        c12.setNome("accademia");
        c12.setNomeEsteso("Via Accademia");
        caselleList.add(c12);
        
        //SOCIETA' ELETTRICA
        Casella c13 = new Societa();
        c13.setId(13);
        c13.setNome("elettrica");
        c13.setNomeEsteso("Società Elettrica");
        caselleList.add(c13);
        
        //CORSO ATENEO
        Casella c14 = new Terreno();
        c14.setId(14);
        c14.setNome("ateneo");
        c14.setNomeEsteso("Corso Ateneo");
        caselleList.add(c14);
        
        //PIAZZA UNIVERSITA'
        Casella c15 = new Terreno();
        c15.setId(15);
        c15.setNome("universita");
        c15.setNomeEsteso("Piazza Università");
        caselleList.add(c15);
        
        //STAZIONE OVEST
        Casella c16 = new Stazione();
        c16.setId(16);
        c16.setNome("ovest");
        c16.setNomeEsteso("Stazione Ovest");
        caselleList.add(c16);
        
        //VIA VERDI
        Casella c17 = new Terreno();
        c17.setId(17);
        c17.setNome("verdi");
        c17.setNomeEsteso("Via Verdi");
        caselleList.add(c17);
        
        //PROBABILITA'
        Casella c18 = new Probabilita();
        c18.setId(18);
        c18.setNome("probabilita2");
        c18.setNomeEsteso("Probabilità");
        caselleList.add(c18);
        
        //CORSO RAFFAELLO
        Casella c19 = new Terreno();
        c19.setId(19);
        c19.setNome("raffaello");
        c19.setNomeEsteso("Corso Raffaello");
        caselleList.add(c19);
        
        //PIAZZA DANTE
        Casella c20 = new Terreno();
        c20.setId(20);
        c20.setNome("dante");
        c20.setNomeEsteso("Piazza Dante");
        caselleList.add(c20);
        
          
        //PARCHEGGIO
        Casella c21 = new Libera();
        c21.setId(21);
        c21.setNome("parcheggio");
        c21.setNomeEsteso("Parcheggio Gratuito");
        caselleList.add(c21);
        
        //VIA MARCO POLO
        Casella c22 = new Terreno();
        c22.setId(22);
        c22.setNome("polo");
        c22.setNomeEsteso("Via Marco Polo");
        caselleList.add(c22);
        
        //IMPREVISTO
        Casella c23 = new Imprevisto();
        c23.setId(23);
        c23.setNome("imprevisto2");
        c23.setNomeEsteso("Imprevisto");
        caselleList.add(c23);
        
        //CORSO MAGELLANO
        Casella c24 = new Terreno();
        c24.setId(24);
        c24.setNome("magellano");
        c24.setNomeEsteso("Corso Magellano");
        caselleList.add(c24);
        
        //LARGO COLOMBO
        Casella c25 = new Terreno();
        c25.setId(25);
        c25.setNome("colombo");
        c25.setNomeEsteso("Largo Colombo");
        caselleList.add(c25);
        
        //STAZIONE NORD
        Casella c26 = new Stazione();
        c26.setId(26);
        c26.setNome("nord");
        c26.setNomeEsteso("Stazione Nord");
        caselleList.add(c26);
        
        //VIALE COSTANTINO
        Casella c27 = new Terreno();
        c27.setId(27);
        c27.setNome("costantino");
        c27.setNomeEsteso("Viale Costantino");
        caselleList.add(c27);
        
        //VIALE TRAIANO
        Casella c28 = new Terreno();
        c28.setId(28);
        c28.setNome("traiano");
        c28.setNomeEsteso("Viale Traiano");
        caselleList.add(c28);
        
        //SOCIETA' ACQUA POTABILE
        Casella c29 = new Societa();
        c29.setId(29);
        c29.setNome("potabile");
        c29.setNomeEsteso("Società Acqua Potabile");
        caselleList.add(c29);
        
        //PIAZZA GIULIO CESARE
        Casella c30 = new Terreno();
        c30.setId(30);
        c30.setNome("cesare");
        c30.setNomeEsteso("Piazza Giulio Cesare");
        caselleList.add(c30);
        
        //PRIGIONE
        Casella c31 = new Prigione();
        c31.setId(31);
        c31.setNome("prigione");
        c31.setNomeEsteso("Vai in Prigione");
        caselleList.add(c31);
        
        //VIA ROMA
        Casella c32 = new Terreno();
        c32.setId(32);
        c32.setNome("roma");
        c32.setNomeEsteso("Via Roma");
        caselleList.add(c32);
        
        //CORSO IMPERO
        Casella c33 = new Terreno();
        c33.setId(33);
        c33.setNome("impero");
        c33.setNomeEsteso("Corso Impero");
        caselleList.add(c33);
        
        //PROBABILITA'
        Casella c34 = new Probabilita();
        c34.setId(34);
        c34.setNome("probabilita3");
        c34.setNomeEsteso("Probabilità");
        caselleList.add(c34);
        
        //LARGO AUGUSTO
        Casella c35 = new Terreno();
        c35.setId(35);
        c35.setNome("augusto");
        c35.setNomeEsteso("Largo Augusto");
        caselleList.add(c35);
        
        //STAZIONE EST
        Casella c36 = new Stazione();
        c36.setId(36);
        c36.setNome("est");
        c36.setNomeEsteso("Stazione Est");
        caselleList.add(c36);
        
        //IMPREVISTI
        Casella c37 = new Imprevisto();
        c37.setId(37);
        c37.setNome("imprevisto3");
        c37.setNomeEsteso("Imprevisto");
        caselleList.add(c37);
        
        //VIALE DEI GIARDINI
        Casella c38 = new Terreno();
        c38.setId(38);
        c38.setNome("giardini");
        c38.setNomeEsteso("Viale Dei Giardini");
        caselleList.add(c38);
        
        //TASSA DI LUSSO
        Casella c39 = new Tassa();
        c39.setId(39);
        c39.setNome("lusso");
        c39.setNomeEsteso("Tassa Di Lusso");
        caselleList.add(c39);
        
        //PARCO DELLA VITTORIA
        Casella c40 = new Terreno();
        c40.setId(40);
        c40.setNome("vittoria");
        c40.setNomeEsteso("Parco Della Vittoria");
        caselleList.add(c40);
        
        setCaselle(caselleList);
        
        
    }
    
    public void stampaCaselle() {
        ArrayList<Casella> list = getCaselle();
        Iterator it = list.iterator();
        String s = new String();
        while(it.hasNext()) {
            Casella c = (Casella)it.next();
            s = new String("[DBG_game]");

            if (c instanceof Casella) {
                s = s.concat(" Casella ");
            }
            if (c instanceof Possedimento) {
                 s = s.concat(" Possedimento ");
            }
            if (c instanceof Terreno) {
                 s = s.concat(" Terreno ");
            }
            
            if (c instanceof Societa) {
                 s = s.concat(" Società ");
            }
            
            if (c instanceof Stazione) {
                 s = s.concat(" Stazione ");
            }
            
            if (c instanceof Imprevisto) {
                 s = s.concat(" Imprevisto ");
            }
            
            if (c instanceof Probabilita) {
                 s = s.concat(" Probabilità ");
            }
            
            if (c instanceof Via) {
                 s = s.concat(" Via ");
            }
            
            if (c instanceof Libera) {
                 s = s.concat(" Libera ");
            }
            
            if (c instanceof Prigione) {
                 s = s.concat(" Prigione ");
            }
            
            if (c instanceof Tassa) {
                 s = s.concat(" Tassa ");

            }
                    
            Monopoli.getMonopoliGUI().debugMessage(s + "; Id: " + c.getId() + "; Nome: " + c.getNome() + "; Nome Esteso: " + c.getNomeEsteso());
               
        }
        
    }

    public String stampaCasella(Casella c) {

            String s = new String();

            if (c instanceof Casella) {
                s = s.concat(" Casella ");
            }
            if (c instanceof Possedimento) {
                 s = s.concat(" Possedimento ");
            }
            if (c instanceof Terreno) {
                 s = s.concat(" Terreno ");
            }

            if (c instanceof Societa) {
                 s = s.concat(" Società ");
            }

            if (c instanceof Stazione) {
                 s = s.concat(" Stazione ");
            }

            if (c instanceof Imprevisto) {
                 s = s.concat(" Imprevisto ");
            }

            if (c instanceof Probabilita) {
                 s = s.concat(" Probabilità ");
            }

            if (c instanceof Via) {
                 s = s.concat(" Via ");
            }

            if (c instanceof Libera) {
                 s = s.concat(" Libera ");
            }

            if (c instanceof Prigione) {
                 s = s.concat(" Prigione ");
            }

            if (c instanceof Tassa) {
                 s = s.concat(" Tassa ");

            }

            s = s + ": " + c.getNomeEsteso();

            if (c instanceof Terreno) {
                Terreno t = (Terreno)c;
                int nCase = Monopoli.getMonopoliPartita().contaCase(t.getCostruzioni());
                int nHotel = Monopoli.getMonopoliPartita().contaHotel(t.getCostruzioni());
                s += " CON " + nCase + " CASE E " + nHotel + " HOTEL";
            }

            return s;
    }

    public void posizionaPedina(Pedina pedina,int casella) {
         Casella c = (Casella)this.getCasella(casella);
         pedina.setPosizione(c);
    }
    
    public void avanzaPedina(Pedina pedina,int step) {
        
             Casella c = pedina.getPosizione();
             step--;
             int idNuovaCasella = (c.getId() + step) % 40;
             Casella nuovaCasella = (Casella)this.getCasella(idNuovaCasella);
             pedina.setPosizione(nuovaCasella);

             String sPedina = monopoli.gui.Pedina.idToName(pedina.getId());
             Monopoli.getMonopoliGUI().debugMessage("[DBG_GAME]Pedina " + sPedina + " avanzata di " + step + " posizione da " + c.getNomeEsteso() + " a " + nuovaCasella.getNomeEsteso());

             //AGGIORNO LA GRAFICA

             Monopoli.getMonopoliGUI().muoviPedina(sPedina,idNuovaCasella);

        }

    void rimuoviPedina(Pedina pedina) {
        pedina.setPosizione(null);
        Monopoli.getMonopoliGUI().rimuoviPedina(monopoli.gui.Pedina.idToName(pedina.getId()));
    }

    void rimuoviCasa(Casella casella) {
        Terreno t = (Terreno)casella;
        Iterator it = t.getCostruzioni().iterator();
        boolean stop=false;
        while(it.hasNext() && stop==false) {
            Costruzione c = (Costruzione)it.next();
            if(c instanceof Casa) {
                t.getCostruzioni().remove(c);
                stop=true; }
        }

        Monopoli.getMonopoliGUI().rimuoviCasa(casella.getId());

    }

    void rimuoviAlbergo(Casella casella) {
        Terreno t = (Terreno)casella;
        Iterator it = t.getCostruzioni().iterator();
        boolean stop=false;
        while(it.hasNext() && stop==false) {
            Costruzione c = (Costruzione)it.next();
            if(c instanceof Albergo) {
                t.getCostruzioni().remove(c);
                stop=true; }
        }
        Monopoli.getMonopoliGUI().rimuoviHotel(casella.getId());
    }
                
           
}

